package com.xuwang.service.impl;

import com.xuwang.Util.JWTutil;
import com.xuwang.mapper.AdditiveMapper;
import com.xuwang.pojo.Additive;
import com.xuwang.pojo.RawMaterial;
import com.xuwang.mapper.RawMaterialMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 原材料表(RawMaterial)表服务实现类
 *
 * @author abaaba
 * @since 2021-09-14 11:15:26
 * @version 1.0
 */
@Service("rawMaterialService")
public class RawMaterialServiceImpl {
    @Resource
    private RawMaterialMapper rawMaterialMapper;
    @Resource
    private AdditiveMapper additiveMapper;
//
//    /**
//     * 根据模糊条件查询总个数
//     *
//     * @param name 查询条件
//     * @return 返回查询到的总个数
//     */
//    public Map<String, Object> selectForCount(String name) {
//        Map<String, Object> map = new HashMap<>();
//        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
//        map.put("code", 200);
//        map.put("msg", "查询成功");
//        map.put("data", this.rawMaterialMapper.selectForCount(name));
//        return map;
//    }

    /**
     * 查询所有本公司的添加剂信息
     *
     * @return 实例对象
     */
    public Map<String, Object> selectAllYlByToken(HttpServletRequest request) {

        String token = request.getHeader("Authorization");
        String userName = JWTutil.getUserName(token);

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
//        map.put("data",this.rawMaterialMapper.selectAll(this.additiveMapper.selectCompanyIdByUsername("原料人")));
        map.put("data",this.rawMaterialMapper.selectAll(this.additiveMapper.selectCompanyIdByUsername(userName)));
        return map;
    }

    /**
     * 查询所有数据
     * @return  返回所有数据
     */
    public Map<String, Object> selectAllRawMarterialType() {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.rawMaterialMapper.selectAllRawMarterialType());
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    public Map<String, Object> selectById(String id) {
        Map<String, Object> map = new HashMap<>();
        // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("code", 200);
        map.put("msg", "查询成功");
        map.put("data", this.rawMaterialMapper.selectById(id));
        return map;
    }

    /**
     * 查询分页数据
     * @param rawMaterialName   原料名
     * @param superCompanyName  供货商名
     * @param companyAddress    供货商地址
     * @param rawMaterialWarranty  保质期
     * @param rawMaterialType  类型
     * @return  返回数据
     */
    public Map<String, Object> selectForPage(int index,int page, String rawMaterialName,String superCompanyName,String companyAddress,Integer rawMaterialWarranty,Integer rawMaterialType,String isDelete) {
        // 获取当前表中的总记录
        int tableCount = this.rawMaterialMapper.selectForCount(rawMaterialName,superCompanyName,companyAddress,rawMaterialWarranty,rawMaterialType,isDelete);
        // 总页码计算   (总条数 - 1) / 每页显示条数  + 1
        // (100 - 1) / 10 + 1 = 10        (101 - 1) / 10 + 1 = 11      (99 - 1) / 10 + 1 = 10
        int pageCount = (tableCount - 1) / page + 1;
        // 计算每页开始的下标值
        index = (index - 1) * page;
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "查询成功");
        map.put("pageCount", pageCount);  // 当前总数
        map.put("count", tableCount);     // 总条数
        map.put("data", this.rawMaterialMapper.selectForPage(index, page,rawMaterialName,superCompanyName,companyAddress,rawMaterialWarranty,rawMaterialType,isDelete));
        return map;
    }

    /**
     * 新增数据
     *
     * @param rawMaterial 实例对象
     * @return 实例对象
     */
    public Map<String, Object> insert(RawMaterial rawMaterial, HttpServletRequest request) {

        String token = request.getHeader("Authorization");
        String userName = JWTutil.getUserName(token);
        this.rawMaterialMapper.insert(rawMaterial.getRawMaterialName(),
                this.rawMaterialMapper.selectCompanyIdByUsername(userName),
//                this.rawMaterialMapper.selectCompanyIdByUsername("原料人"),
                rawMaterial.getRawMaterialWarranty(),
                rawMaterial.getRawMaterialTypeId()
        );

        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "新增成功");
        return map;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param rawMaterial 实例对象
     * @return 实例对象
     */
    public Map<String, Object> updateById(RawMaterial rawMaterial, HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        String userName = JWTutil.getUserName(token);

        rawMaterialMapper.updateIsDeleteById(rawMaterial.getId().toString(),1);//删除更改前的数据
        this.rawMaterialMapper.insert(rawMaterial.getRawMaterialName(),
                this.rawMaterialMapper.selectCompanyIdByUsername(userName),
//                this.rawMaterialMapper.selectCompanyIdByUsername("原料人"),
                rawMaterial.getRawMaterialWarranty(),
                rawMaterial.getRawMaterialTypeId()
        );
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "更新成功");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    public Map<String, Object> deleteById(String id) {
        this.rawMaterialMapper.deleteById(id);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除成功");
        return map;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    public Map<String, Object> updateIsDeleteById(String id,int isDelete) {
        this.rawMaterialMapper.updateIsDeleteById(id,isDelete);
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", isDelete==0?"恢复成功":"删除成功");
        return map;
    }

    /**
     * 批量删除多条数据
     *
     * @param ids 批量主键
     * @return 单条数据
     */
    public Map<String, Object> updateIsDeleteByIds(String ids) {
        String[] split = ids.split(",");
        for (int i = 0; i < split.length; i++) {
            this.rawMaterialMapper.updateIsDeleteById(split[i],1);
        }
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);   // 前端端分离时，前端人员会首先判断code值是否满足200，如果不是200，则提醒用户失败
        map.put("msg", "删除多条成功");
        return map;
    }

}